#ifndef __BMI088REG_H_
#define __BMI088REG_H_


/**
 * @Author         : Minghang Li
 * @Date           : 2022-11-25 23:01
 * @LastEditTime   : 2025- 1-17
 * @Note           :
 * @edit           : Liuxc
 */
#pragma once

#define BMI088_ACCEL_3G_SEN 0.0008974358974f
#define DEG2SEC 0.0174532925f //角度转弧度
#define SEC2DEG 57.295779578f //弧度转角度
#define BMI088_ENABLE (1)
#define BMI088_DISABLE (0)

/*-----bmi088的spi读取协议部分-----*/
#define BMI088_SPI_WRITE_CODE 0x7F  //写入命令 高位置0 0b01111111
#define BMI088_SPI_READ_CODE 0x80   //读取命令 高位置1 0b10000000

/*-----加速度计寄存器表-----*/
#define ACC_CHIP_ID_ADDR 0x00 //加速度计芯片ID寄存器地址
#define ACC_CHIP_ID_VAL 0x1E  //加速度计芯片默认的ID值

#define ACC_ERR_REG_ADDR 0x02 /*返回错误信息寄存器地址
bit
[7:5]保留
[4:2]000没有错误 001加速计配置出现错误 
[1]保留
[0]为真时:致命错误，芯片未处于操作状态（Boot-电力系统）
此标志仅在以下情况下重置开机复位或软复位*/

#define ACC_STATUS_ADDR 0x03  //bit[7]reset值为0 : turn加速计的数据已准备就绪,读出加速度数据寄存器时会重置为0 [6:0]保留
//0x04 - 0x11 地址保留
#define ACC_X_LSB_ADDR 0x12
#define ACC_X_MSB_ADDR 0x13
#define ACC_Y_LSB_ADDR 0x14
#define ACC_Y_MSB_ADDR 0x15
#define ACC_Z_LSB_ADDR 0x16
#define ACC_Z_MSB_ADDR 0x17
#define ACC_XYZ_LEN 6

#define SENSORTIME_0_ADDR 0x18 //传感器时间 [23:16]
#define SENSORTIME_0_UNIT (39.0625f / 1000000.0f)//每39.0625us增加一次计数

#define SENSORTIME_1_ADDR 0x19 //传感器时间 [15:8]
#define SENSORTIME_1_UNIT (10.0 / 1000.0f)//每10ms增加一次计数

#define SENSORTIME_2_ADDR 0x1A //传感器时间 [7:0]
#define SENSORTIME_2_UNIT (2.56f)//每2.56s增加一次计数
#define SENSORTIME_LEN 3 //这个24bit的时间计数器 总共会在 655.36秒后发生一次溢出(11分钟左右)
//0x1B - 0x1c 地址保留
#define ACC_INT_STAT_1_ADDR 0x1D //加速度计就绪中断状态寄存器 读取后清除
#define ACC_INT_STAT_1_DATA_UNIT 0x00
#define ACC_INT_STAT_1_DATA_READY (0x01 << 7)
//0x1E - 0x21 地址保留
#define TEMP_MSB_ADDR 0x22 //温度高字节 [10:3]
#define TEMP_LSB_ADDR 0x23 //温度低字节 [2:0]
#define TEMP_LEN 2
#define TEMP_UNIT 0.125f
#define TEMP_BIAS 23.0f

#define FIFO_LENGTH_0_ADDR 0x24 //FIFO数据长度寄存器 [7:0]
#define FIFO_LENGTH_1_ADDR 0x25 //FIFO数据长度寄存器 [13:8]
#define FIFI_LENGTH_UNIT 0x8000

#define ACC_FIFO_DATA_ADDR 0x26 //FIFO数据寄存器地址 读取一帧数据地址 FIFI地址不会自动增加

//0x27 - 0x3f 地址保留
#define ACC_CONF_ADDR 0x40 //加速度计配置寄存器地址
#define ACC_CONF_RESERVED 0xA8  //上电默认值 0b10101000
#define ACC_CONF_BWP_OSR4 0x08  //0b1000
#define ACC_CONF_BWP_OSR2 0x09  //0b1001
#define ACC_CONF_BWP_NORM 0x0A  //0b1010
#define ACC_CONF_ODR_12_5_Hz 0x05
#define ACC_CONF_ODR_25_Hz 0x06
#define ACC_CONF_ODR_50_Hz 0x07
#define ACC_CONF_ODR_100_Hz 0x08
#define ACC_CONF_ODR_200_Hz 0x09
#define ACC_CONF_ODR_400_Hz 0x0A
#define ACC_CONF_ODR_800_Hz 0x0B
#define ACC_CONF_ODR_1600_Hz 0x0C

#define ACC_RANGE_ADDR 0x41 //加速度计量程寄存器地址
#define ACC_RANGE_3G 0x00 //上电默认值
#define ACC_RANGE_6G 0x01
#define ACC_RANGE_12G 0x02
#define ACC_RANGE_24G 0x03

//0x42 - 0x44 地址保留

#define ACC_FIFO_DOWNS_ADDR 0x45 //FIFO采样时钟分频寄存器地址(降低采样率) 降低后的频率 = ODR/(2^FIFO_DOWNS)
//[7]bit must always be 1 | [6:4] FIFO_DOWNS [3:0]reserved
#define ACC_FIFO_DOWNS_VAL(x) (0x80 | ((x)<<4)) //设置FIFO_DOWNS的值 3bit位宽


#define ACC_FIFO_WTM_0_ADDR 0x46 //FIFO水位标记寄存器0 [7:0]
#define ACC_FIFO_WTM_1_ADDR 0x47 //FIFO水位标记寄存器1 [12:8]
 
#define ACC_FIFO_CONFIG_0_ADDR 0x48 //FIFO配置寄存器0 配置FIFO模式
/**
 * @brief 设置FIFO模式
 * @param x 0:STREAM mode | 1: FIFO mode
*/
#define ACC_FIFO_CONFIG_0_FIFO_MODE(x) ((0x02)|(x))
#define ACC_FIFO_MODE_STREAM 0x00
#define ACC_FIFO_MODE_FIFO 0x01

#define ACC_FIFO_CONFIG_1_ADDR 0x49 //FIFO配置寄存器1 为FIFO选择源
/**
 * @brief 设置FIFO选择源
 * @param accen 使能加速度传感器数据储存
 * @param int1_en 使能中断1,引脚需要配置
 * @param int2_en 使能中断2,引脚需要配置
 * @note bit4 需要配置为1
*/
#define ACC_FIFO_CONFIG_1_FIFO_SOURCES(accen,int1_en,int2_en) ((accen<<6)|(0b01<<4)|(int1_en<<3)|(int2_en<<2))

//0x4A - 0x52 地址保留


#define ACC_INT1_IO_CTRL_ADDR 0x53 // 中断1控制寄存器地址 配置中断引脚功能 上电默认值0x00
/**
* @param int1_out 输出引脚中断使能
* @param int1_od  引脚设置:推挽0/开漏1
* @param int1_lvl 中断级别:低0/高1
* @param int1_in  输入引脚中断使能 
*/
#define ACC_INT1_IO_CONF_VAL(int1_in,int1_out,int1_od,int1_lvl) ((int1_in<<4)|(int1_out<<3)|(int1_od<<2)|(int1_lvl<<1))

#define ACC_INT2_IO_CTRL_ADDR 0x54 // 中断2控制寄存器地址  上电默认值0x00
/**
* @param int2_in  输入引脚中断使能 
* @param int2_out 输出引脚中断使能
* @param int2_od  引脚设置:推挽0/开漏1
* @param int2_lvl 中断级别:低0/高1
*/
#define ACC_INT2_IO_CONF_VAL(int2_in,int1_out,int2_od,int2_lvl) ((int2_in<<4)|(int1_out<<3)|(int2_od<<2)|(int2_lvl<<1))

//0x55 - 0x57 地址保留

#define ACC_INT_MAP_DATA_ADDR 0x58 //中断映射数据寄存器地址
/**
 * @param int2_drdy 映射中断2数据准备好中断
 * @param int2_fwm  映射FIFO 中断2水位标记中断
 * @param int2_fful 映射FIFO 中断2溢出中断
 * @param int1_drdy 映射中断1数据准备好中断
 * @param int1_fwm  映射FIFO 中断1水位标记中断
 * @param int1_full 映射FIFO 中断1溢出中断
*/
#define ACC_INT1_MAP_DATA_VAL(int2_drdy,int2_fwm,int2_fful,int1_drdy,int1_fwm,int1_full)  ((int2_drdy<<6)|(int2_fwm<<5)|(int2_fful<<4)|(int1_drdy<<2)|(int1_fwm<<1)|(int1_full))

//0x59 - 0x6B 地址保留
//0x6c 数据手册中未标注

#define ACC_SELF_TEST_ADDR 0x6D//加速度计自检寄存器地址
#define ACC_SELF_TEST_OFF 0x00
#define ACC_SELF_TEST_POS 0x0D//正向测试
#define ACC_SELF_TEST_NEG 0x09//反向测试

//0x6E - 0x7B 地址保留

#define ACC_PWR_CONF_ADDR 0x7C  //加速度电源
#define ACC_PWR_CONF_SUS 0x03  //suspend模式
#define ACC_PWR_CONF_ACT 0x00  //active模式

#define ACC_PWR_CTRL_ADDR 0x7D //加速度计电源开关寄存器地址
#define ACC_PWR_CTRL_ON 0x04   //加速度计电源打开
#define ACC_PWR_CTRL_OFF 0x00  //加速度计电源关闭

#define ACC_SOFTRESET_ADDR 0x7E //加速度计重启寄存器地址
#define ACC_SOFTRESET_VAL 0xB6  //加速度计重启命令

/************************************************/
/****************加速度计数据表结束*****************/
/************************************************/

/*-----陀螺仪寄存器表-----*/
#define GYRO_CHIP_ID_ADDR 0x00
#define GYRO_CHIP_ID_VAL 0x0F

//0x01 保留

#define GYRO_RATE_X_LSB_ADDR 0x02
#define GYRO_RATE_X_MSB_ADDR 0x03
#define GYRO_RATE_Y_LSB_ADDR 0x04
#define GYRO_RATE_Y_MSB_ADDR 0x05
#define GYRO_RATE_Z_LSB_ADDR 0x06
#define GYRO_RATE_Z_MSB_ADDR 0x07
#define GYRO_XYZ_LEN 6

//0x08 - 0x09 地址保留

#define GYRO_INT_STAT_1_ADDR 0x0A //中断状态

//0x0B - 0x0D 地址保留

#define GYRO_FIFO_STATUS_ADDR 0x0E 

#define GYRO_RANGE_ADDR 0x0F
#define GYRO_RANGE_2000_DEG_S 0x00
#define GYRO_RANGE_1000_DEG_S 0x01
#define GYRO_RANGE_500_DEG_S 0x02
#define GYRO_RANGE_250_DEG_S 0x03
#define GYRO_RANGE_125_DEG_S 0x04

#define GYRO_BANDWIDTH_ADDR 0x10
#define GYRO_ODR_2000Hz_BANDWIDTH_532Hz 0x00
#define GYRO_ODR_2000Hz_BANDWIDTH_230Hz 0x01
#define GYRO_ODR_1000Hz_BANDWIDTH_116Hz 0x02
#define GYRO_ODR_400Hz_BANDWIDTH_47Hz 0x03
#define GYRO_ODR_200Hz_BANDWIDTH_23Hz 0x04
#define GYRO_ODR_100Hz_BANDWIDTH_12Hz 0x05
#define GYRO_ODR_200Hz_BANDWIDTH_64Hz 0x06
#define GYRO_ODR_100Hz_BANDWIDTH_32Hz 0x07

#define GYRO_LPM1_ADDR 0x11
#define GYRO_LPM1_NOR 0x00
#define GYRO_LPM1_SUS 0x80
#define GYRO_LPM1_DEEP_SUS 0x20

//0x12 - 0x13 地址保留

#define GYRO_SOFTRESET_ADDR 0x14
#define GYRO_SOFTRESET_VAL 0xB6

#define GYRO_INT_CTRL_ADDR 0x15
#define GYRO_INT_CTRL_VAL(en_new_int,en_fifo_int) ((en_new_int<<7)|(en_fifo_int<< 6))

#define GYRO_INT3_INT4_IO_CONF_ADDR 0x16
/**
 * @param int4_od  引脚设置:推挽0/开漏1
 * @param int4_lvl 中断级别:低0/高1
 * @param int3_od  引脚设置:推挽0/开漏1
 * @param int3_lvl 中断级别:低0/高1
*/
#define GYRO_INT3_INT4_IO_CONF_VAL(int4_od,int4_lvl,int3_od,int3_lvl) ((int4_od<<3)|(int4_lvl<<2)|(int3_od<<1)|(int3_lvl))
//0x17 地址保留

#define GYRO_INT3_INT4_IO_MAP_ADDR 0x18
/**
 * @param int4_pin 映射中断4引脚
 * @param int4_ff  映射FIFO 中断4
 * @param int3_ff  映射FIFO 中断3
 * @param int3_pin 映射中断3引脚
*/
#define GYRO_INT3_INT4_IO_MAP_VAL(int4_pin,int4_ff,int3_ff,int3_pin) ((int4_pin<<7)|(int4_ff<<5)|(int3_ff<<2)|(int3_pin))
//0x19 - 0x1D 地址保留
/* FIFO水位中断使能寄存器 */
#define GYRO_FIFO_WM_EN_ADDR 0x1E
#define GYRO_FIFO_WM_EN_VAL 0x88
#define GYRO_FIFO_WM_DIS_VAL 0x08
//0x1F - 0x33 地址保留

#define GYRO_FIFO_EXT_INT_S_ADDR 0x34
/**
 * @param en_fifo_sync 使能FIFO同步中断
 * @param sync_source 同步源选择
 * @note 同步源选择:0 int3 | 1 int4
 **/
#define GYRO_FIFO_EXT_INT_S_VAL(en_fifo_sync,sync_source) ((en_fifo_sync<<5)|(sync_source<<4))
//0x35 - 0x3B 地址保留

#define GYRO_SELF_TEST_ADDR 0x3C/* 自检寄存器地址
                                    [4]  传感器数据正常
                                    [2]  自检完成后如果为1，则传感器数据异常
                                    [1]  自检完成后为1
                                    [0]  设置为1后自检开始，结束后自动清除*/
#define GYRO_SELF_TEST_ON 0x01

#define GYRO_FIFO_CONFIG0_ADDR 0x3D
#define GYRO_FIFO_CONFIG0_VAL(fwm_lvl) (fwm & 07f) //水位标记水平 最大位宽为7位

#define GYRO_FIFO_CONFIG1_ADDR 0x3E
#define GYRO_FIFO_MODE_FIFO 0x40 //FIFO模式
#define GYRO_FIFO_MODE_STREAM 0x80 //默认为 STREAM(流)模式

#define GYRO_FIFO_DATA_ADDR 0x3F

#endif
